package view;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import modelos.Empresa;
import util.Tabela;
import fachada.Fachada;
import javax.swing.JScrollPane;
import javax.swing.ImageIcon;

public class ViewCadastroEmpresa extends JFrame implements ActionListener, ChangeListener{

	private JPanel contentPane;
	private JTextField txtNome;
	private JTextField txtSite;
	private JTextField txtContato;
	private JTextField txtTelefone;
	private JTextField txtCnpj;
	private JTextField txtEmail;
	private JTextField txtFiltro;
	private JButton btnCadastrar;
	private JButton btnEditar;
	private JButton btnRemover;
	private JButton btnBuscar;
	private Tabela<Empresa> tabela;
	private JComboBox comboFiltro;
	private Empresa atualizacao;
	private JTabbedPane tabbedPane;

	public ViewCadastroEmpresa() {
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 571, 421);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		
		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		
		JLabel lblEmpresa = new JLabel("Empresa");
		lblEmpresa.setFont(new Font("Calibri", Font.BOLD, 15));
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane.setHorizontalGroup(
			gl_contentPane.createParallelGroup(Alignment.TRAILING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_contentPane.createSequentialGroup()
							.addGap(245)
							.addComponent(lblEmpresa))
						.addGroup(gl_contentPane.createSequentialGroup()
							.addContainerGap()
							.addComponent(tabbedPane, GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE)))
					.addContainerGap())
		);
		gl_contentPane.setVerticalGroup(
			gl_contentPane.createParallelGroup(Alignment.TRAILING)
				.addGroup(Alignment.LEADING, gl_contentPane.createSequentialGroup()
					.addComponent(lblEmpresa)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(tabbedPane, GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE)
					.addContainerGap())
		);
		
		JPanel panel = new JPanel();
		tabbedPane.addTab("Cadastro", null, panel, null);
		panel.setLayout(null);
		
		txtNome = new JTextField();
		txtNome.setBounds(99, 84, 403, 20);
		txtNome.setColumns(10);
		panel.add(txtNome);
		
		JLabel label = new JLabel("Nome :");
		label.setBounds(22, 87, 49, 14);
		panel.add(label);
		
		JLabel lblCnpj = new JLabel("CNPJ :");
		lblCnpj.setBounds(22, 122, 87, 14);
		panel.add(lblCnpj);
		
		txtSite = new JTextField();
		txtSite.setBounds(329, 122, 173, 20);
		txtSite.setColumns(10);
		panel.add(txtSite);
		
		JLabel lblSite = new JLabel("Site :");
		lblSite.setBounds(281, 122, 46, 14);
		panel.add(lblSite);
		
		txtContato = new JTextField();
		txtContato.setBounds(99, 191, 161, 20);
		txtContato.setColumns(10);
		panel.add(txtContato);
		
		txtTelefone = new JTextField();
		txtTelefone.setBounds(329, 153, 173, 20);
		txtTelefone.setColumns(10);
		panel.add(txtTelefone);
		
		JLabel lblEmail = new JLabel("E-mail :");
		lblEmail.setBounds(22, 159, 87, 14);
		panel.add(lblEmail);
		
		JLabel lblContato = new JLabel("Contato :");
		lblContato.setBounds(22, 194, 87, 14);
		panel.add(lblContato);
		
		txtCnpj = new JTextField();
		txtCnpj.setBounds(99, 119, 161, 20);
		txtCnpj.setColumns(10);
		panel.add(txtCnpj);
		
		txtEmail = new JTextField();
		txtEmail.setBounds(99, 156, 161, 20);
		txtEmail.setColumns(10);
		panel.add(txtEmail);
		
		JLabel lblTel = new JLabel("Tel :");
		lblTel.setBounds(281, 156, 63, 14);
		panel.add(lblTel);
		
		btnCadastrar = new JButton("Cadastrar");
		btnCadastrar.setIcon(new ImageIcon(ViewCadastroEmpresa.class.getResource("/img/icon_save.png")));
		btnCadastrar.addActionListener(this);
		btnCadastrar.setBounds(393, 260, 109, 33);
		panel.add(btnCadastrar);
		
		JLabel lblCadastrarEmpresa = new JLabel("Cadastrar Empresa");
		lblCadastrarEmpresa.setFont(new Font("Tahoma", Font.PLAIN, 20));
		lblCadastrarEmpresa.setBounds(189, 24, 188, 33);
		panel.add(lblCadastrarEmpresa);
		
		JPanel panel_1 = new JPanel();
		tabbedPane.addTab("Listar", null, panel_1, null);
		panel_1.setLayout(null);

		comboFiltro = new JComboBox<String>();
		comboFiltro.setModel(new DefaultComboBoxModel(new String[] {"Nome", "CNPJ"}));
		comboFiltro.setBounds(25, 51, 91, 20);
		panel_1.add(comboFiltro);
		
		JLabel lblNewLabel = new JLabel("Filtro");
		lblNewLabel.setBounds(20, 26, 46, 14);
		panel_1.add(lblNewLabel);
		
		txtFiltro = new JTextField();
		txtFiltro.setBounds(126, 51, 265, 20);
		panel_1.add(txtFiltro);
		txtFiltro.setColumns(10);
		
		btnBuscar = new JButton("Buscar");
		btnBuscar.setIcon(new ImageIcon(ViewCadastroEmpresa.class.getResource("/img/icon_lupa.png")));
		btnBuscar.addActionListener(this);
		btnBuscar.setBounds(401, 50, 104, 23);
		panel_1.add(btnBuscar);
		
		btnEditar = new JButton("Editar");
		btnEditar.setIcon(new ImageIcon(ViewCadastroEmpresa.class.getResource("/img/icon_edit.png")));
		btnEditar.addActionListener(this);
		btnEditar.setBounds(301, 272, 91, 33);
		panel_1.add(btnEditar);
		
		btnRemover = new JButton("Remover");
		btnRemover.setIcon(new ImageIcon(ViewCadastroEmpresa.class.getResource("/img/icon_cancel.png")));
		btnRemover.addActionListener(this);
		btnRemover.setBounds(402, 272, 103, 33);
		panel_1.add(btnRemover);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(25, 85, 480, 176);
		panel_1.add(scrollPane);
		
		tabela = new Tabela<Empresa>(new String[] {"Nome", "CNPJ", "Contato"});
		tabela.getColumnModel().getColumn(0).setResizable(false);
		tabela.getColumnModel().getColumn(0).setPreferredWidth(200);
		tabela.getColumnModel().getColumn(1).setResizable(false);
		tabela.getColumnModel().getColumn(1).setPreferredWidth(100);
		tabela.getColumnModel().getColumn(2).setResizable(false);
		tabela.getColumnModel().getColumn(2).setPreferredWidth(200);
		tabela.montarTabela(Fachada.getInstancia().cadastroEmpresa().listarEmpresa());
		scrollPane.setViewportView(tabela);
		contentPane.setLayout(gl_contentPane);
		
		tabbedPane.addChangeListener(this);
	}

	public void actionPerformed(ActionEvent e) {
		JComponent elemento = (JComponent) e.getSource();
		if(elemento.equals(btnCadastrar)){
			if(btnCadastrar.getText().equals("Cadastrar")){
				cadastrar();
			}
			else if(btnCadastrar.getText().equals("Atualizar")){
				atualizar();
			}
		}
		else if(elemento.equals(btnBuscar)){
			montarTabela();
		}
		else if(elemento.equals(btnEditar)){
			editar();
			btnCadastrar.setText("Atualizar");
		}
		else if(elemento.equals(btnRemover)){
			remover();
		}
	}
	
	private void atualizar(){
		
		atualizacao.setCnpj(txtCnpj.getText());
		atualizacao.setContato(txtContato.getText());
		atualizacao.setEmail(txtEmail.getText());
		atualizacao.setNome(txtNome.getText());
		atualizacao.setSite(txtSite.getText());
		atualizacao.setTelefone(txtTelefone.getText());
		
		Fachada f = Fachada.getInstancia();
		f.cadastroEmpresa().editarEmpresa(atualizacao);
		
		JOptionPane.showMessageDialog(this, "Empresa atualizada com sucesso");
		btnCadastrar.setText("Cadastrar");
		limpar();
	}
	
	private void editar(){
		
		int linha = tabela.getSelectedRow();

		if(linha != -1){
			atualizacao = (Empresa) tabela.getModel().getValueAt(linha, 0);
			
			tabbedPane.setSelectedIndex(0);
			
			txtNome.setText(atualizacao.getNome());
			txtCnpj.setText(atualizacao.getCnpj());
			txtSite.setText(atualizacao.getSite());
			txtEmail.setText(atualizacao.getEmail());
			txtTelefone.setText(atualizacao.getTelefone());
			txtContato.setText(atualizacao.getContato());
		}	
	}
	
	private void remover(){
		
		int linha = tabela.getSelectedRow();

		if(linha != -1){
			Object[] options = { "OK", "Cancelar" };
			int resposta = JOptionPane.showOptionDialog(this, "Tem certeza que deseja remover?", "Alerta !!", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
			if(resposta == 0){
				Empresa e = (Empresa) tabela.getModel().getValueAt(linha, 0);
				Fachada fachada = Fachada.getInstancia();
				fachada.cadastroEmpresa().removerEmpresa(e);
				montarTabela();
			}
		}
	}
	
	private void limpar(){
		
		txtCnpj.setText("");
		txtNome.setText("");
		txtSite.setText("");
		txtEmail.setText("");
		txtTelefone.setText("");
		txtContato.setText("");
	}
	
	private void montarTabela(){

		Fachada fachada = Fachada.getInstancia();
		String filtro = txtFiltro.getText();
		List<Empresa> empresas = null;

		if(!filtro.equals("")){
			int combo = comboFiltro.getSelectedIndex();
			//busca por nome
			if(combo == 0){
				empresas = fachada.cadastroEmpresa().buscarNome(filtro);
			}
			//busca por cnpj
			else if(combo == 1){
				empresas = fachada.cadastroEmpresa().buscarCnpj(filtro);
			}
		}
		else{
			empresas = fachada.cadastroEmpresa().listarEmpresa();
		}

		tabela.montarTabela(empresas);
	}
	
	private void cadastrar(){
		
		String cnpj = txtCnpj.getText();
		String nome = txtNome.getText();
		String site = txtSite.getText();
		String email = txtEmail.getText();
		String telefone = txtTelefone.getText();
		String contato = txtContato.getText();
		
		Empresa e = new Empresa();
		e.setCnpj(cnpj);
		e.setNome(nome);
		e.setSite(site);
		e.setEmail(email);
		e.setTelefone(telefone);
		e.setContato(contato);
		
		Fachada f = Fachada.getInstancia();
		f.cadastroEmpresa().adicionarEmpresa(e);
		JOptionPane.showMessageDialog(this, "Empresa cadastrada com sucesso.");
		limpar();
	}
	
	public void stateChanged(ChangeEvent evt) {
		JComponent componente = (JComponent) evt.getSource();
		if(componente.equals(tabbedPane)){
			if(tabbedPane.getSelectedIndex() == 1){
				montarTabela();
				btnCadastrar.setText("Cadastrar");
			}
			else if(tabbedPane.getSelectedIndex() == 0){
				limpar();
			}
		}
	}
}
